package multithread.interrupt;

import java.util.concurrent.TimeUnit;

/**
 * Created by xi on 2019/2/17.
 */
public class InterruputSleepThread3 {

    //当一个线程处于被阻塞状态或者试图执行一个阻塞操作时，使用Thread.interrupt()方式中断该线程，注意此时将会抛出一个InterruptedException的异常，同时中断状态将会被复位(由中断状态改为非中断状态)，如下代码将演示该过程：

    //不管代码块是否在syn里面
    public static void testSleep() throws InterruptedException{
        Thread t1 = new Thread() {
            @Override
            public void run() {
                // while在try中，通过异常中断就可以退出run循环
                try {
                    // 当前线程处于阻塞状态，异常必须捕捉处理，无法往外抛出
                    //阻塞状态
                    TimeUnit.MINUTES.sleep(2);
                } catch (InterruptedException e) { // InterruptedException
                    System.out.println("Interruted When Sleep");
                    boolean f1 = this.isInterrupted();
                    boolean f2 = this.interrupted();
                    boolean f1_1 =  this.isInterrupted();
                    // 中断状态被复位
                    System.out.println("f1:" + f1+",f2:"+f2 +",f1_1:" + f1_1);//
                }
            }
        };
        t1.start();
        TimeUnit.SECONDS.sleep(2);
        // 中断处于阻塞状态的线程
        t1.interrupt(); //
        System.out.println("aa:" +t1.isInterrupted());
    }

    /**
     * syn代码块里面如果有sleep也能响应中断；
     * @throws InterruptedException
     */
    public static void testSleepInSyn() throws InterruptedException{
        Thread t1 = new Thread() {
            @Override
            public void run() {
                // while在try中，通过异常中断就可以退出run循环
                try {
                    // 当前线程处于阻塞状态，异常必须捕捉处理，无法往外抛出
                    //阻塞状态
                    synchronized (InterruputSleepThread3.class){
                        TimeUnit.MINUTES.sleep(2000);
                    }
                } catch (InterruptedException e) { // InterruptedException 有异常之后会把当前线程的状态
                    System.out.println("Interruted When Sleep");
                    boolean f1 = this.isInterrupted(); //当前对象的线程的状态 false
                    boolean f2 = this.interrupted(); // false 调用isInterrupted(true)判断的是当前线程是否被中断
                    boolean f1_1 =  this.isInterrupted(); //false
                    // 中断状态被复位
                    System.out.println("f1:" + f1+",f2:"+f2 +",f1_1:" + f1_1);
                }
            }
        };
        t1.start();
        //TimeUnit.SECONDS.sleep(2);
        // 中断处于阻塞状态的线程
        t1.interrupt(); //中断线程
        System.out.println("aa:" +t1.isInterrupted()); //flase 判断调用对象所在线程是否中断，这里是main线程
    }

    public static void main(String[] args) throws InterruptedException {
        testSleepInSyn();

    }

}
